﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Media;
using System.Collections.ObjectModel;
using System.Data;
using System.Windows.Media.Imaging;
using System.ComponentModel;
using System.Diagnostics;
using System.Windows.Controls;
using System.Globalization;
using produccion.modelo;
using produccion.AccesoDatos;
using produccion.clases;
using produccion.forms;
using System.Windows.Input;
using System.Collections.Specialized;

namespace produccion.vistamodelo
{
    class VMExplosionMateriales : ViewModelBase, IDataErrorInfo
    {
        #region FJRF - VARIABLES GENERIAS DE TODO EL FORMULARIO
        MDOgeneral MdoGeneral = new MDOgeneral();//FJRF - Traemos toda la informacion y funciones de MdoGeneral

        DataTable DtEncabezadoYParametros;//FJRF - Usamos este DataTable para hacer consultas generales del os encabezados mas los parametros
        DataTable DtImprimir;//FJRF - Usamos este DataTable para imprimir
        DataSet DsImprimir;//FJRF - Usamos este dataset para la impresion de consultas

        //String StrRutaReporteCrystalReport = @"c:\produccion\produccion\reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        String StrRutaReporteCrystalReport = @"reportes\";//FJRF - Esta es la ruta de los reportes de crystal reports
        #endregion

        #region Campos
        
        private List<CLSMAEGRP> _grupos = new List<CLSMAEGRP>();
        private List<CLSMAESUB> _subgrupos = new List<CLSMAESUB>();
        private CLSMAEGRP _selgrupo = new CLSMAEGRP();
        private CLSMAESUB _selsubgrupo = new CLSMAESUB();
        private ProcesoProduccionRepositorio _repositorio = new ProcesoProduccionRepositorio();
        private string strLisPed = "";
        private string strgru = " ";
        private string strsubgru = " ";
        
        #endregion
        
        #region Constructor

        public VMExplosionMateriales()
        {
            try
            {
                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "Explosión de Materiales" + " - Usuario: " + MDOgeneral.usuario + " - [FRMExplosiondeMateriales]";
                lispedidos.CollectionChanged += OnCollectionChanged;
                lisdetallepedido.Clear();
                lisDetallePedidoDefinitivo.Clear();
                cargarGrupos();
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }
        
        #endregion

        #region Propiedades publicas

        private Boolean _logConSustitutos;
        public Boolean logConSustitutos
        {
            get { return _logConSustitutos; }
            set { _logConSustitutos = value; base.OnPropertyChanged("logConSustitutos"); }
        }

        public List<CLSMAEGRP> grupos
        {
            get { return _grupos; }
            set { _grupos = value; base.OnPropertyChanged("grupos"); }
        }

        public CLSMAEGRP selgrupo
        {
            get { return _selgrupo; }
            set 
            { 
                _selgrupo = value;
                if (_selgrupo != null)
                    cargarSubgrupos();
                base.OnPropertyChanged("selgrupo"); 
            }
        }

        public List<CLSMAESUB> subgrupos
        {
            get { return _subgrupos; }
            set { _subgrupos = value; base.OnPropertyChanged("subgrupos"); }
        }

        public CLSMAESUB selsubgrupo
        {
            get { return _selsubgrupo; }
            set { _selsubgrupo = value; base.OnPropertyChanged("selsubgrupo"); }
        }

        private ObservableCollection<VMPedidos> _lispedido = new ObservableCollection<VMPedidos>();
        public ObservableCollection<VMPedidos> lispedidos
        {
            get { return _lispedido; }
            set { _lispedido = value; base.OnPropertyChanged("lispedidos"); }
        }

        private VMPedidos _selpedido;
        public VMPedidos selpedido
        {
            get { return _selpedido; }
            set { _selpedido = value; base.OnPropertyChanged("selpedido"); }
        }

        private ObservableCollection<VMDetallePedido> _lisdetallepedido = new ObservableCollection<VMDetallePedido>();
        public ObservableCollection<VMDetallePedido> lisdetallepedido
        {
            get { return _lisdetallepedido; }
            set { _lisdetallepedido = value; base.OnPropertyChanged("lisdetallepedido"); }
        }

        private List<VMDetallePedido> _lisDetallePedidoDefinitivo = new List<VMDetallePedido>();
        public List<VMDetallePedido> lisDetallePedidoDefinitivo
        {
            get { return _lisDetallePedidoDefinitivo; }
            set { _lisDetallePedidoDefinitivo = value; base.OnPropertyChanged("lisDetallePedidoDefinitivo"); }
        }

        private VMDetallePedido _seldetallepedido;
        public VMDetallePedido seldetallepedido
        {
            get { return _seldetallepedido; }
            set 
            { 
                _seldetallepedido = value; 
                base.OnPropertyChanged("seldetallepedido");
                if (seldetallepedido != null)
                {
                    if (seldetallepedido.strReferencia != null)
                    {
                        visorFotoReferencia.strCodigo = seldetallepedido.strReferencia;
                        visorFotoReferencia.strColor = seldetallepedido.strColor;
                    }
                    else
                    {
                        visorFotoReferencia.strCodigo = "";
                        visorFotoReferencia.strColor = "";
                    }
                }
                else
                {
                    visorFotoReferencia.strCodigo = "";
                    visorFotoReferencia.strColor = "";
                }
                
            }
        }

        private string _strConcepto;
        public string strConcepto
        {
            get { return _strConcepto; }
            set
            {
                _strConcepto = value;
                if (value != null)
                {
                    if (value.Length > 3)
                        logConcepto = false;
                    else
                        logConcepto = true;
                }
                base.OnPropertyChanged("strConcepto");
            }
        }

        private Int32 _numExplosion=0;
        public Int32 numExplosion
        {
            get { return _numExplosion; }
            set { _numExplosion = value; base.OnPropertyChanged("numExplosion"); }
        }

        private List<MExplosionMateriales.ExplosiondeMateriales> _lisexplosion = new List<MExplosionMateriales.ExplosiondeMateriales>();
        public List<MExplosionMateriales.ExplosiondeMateriales> lisexplosion
        {
            get { return _lisexplosion; }
            set { _lisexplosion = value; base.OnPropertyChanged("lisexplosion"); }
        }

        private MExplosionMateriales.ExplosiondeMateriales _sellisexplosion;
        public MExplosionMateriales.ExplosiondeMateriales sellisexplosion
        {
            get { return _sellisexplosion; }
            set { _sellisexplosion = value; base.OnPropertyChanged("sellisexplosion"); }
        }

        private List<MExplosionMateriales.ResumenExplosion> _lisresumen = new List<MExplosionMateriales.ResumenExplosion>();
        public List<MExplosionMateriales.ResumenExplosion> lisresumen
        {
            get { return _lisresumen; }
            set { _lisresumen = value; base.OnPropertyChanged("lisresumen"); }
        }

        private MExplosionMateriales.ResumenExplosion _sellisresumen;
        public MExplosionMateriales.ResumenExplosion sellisresumen
        {
            get { return _sellisresumen; }
            set { _sellisresumen = value; base.OnPropertyChanged("sellisresumen"); }
        }

        private List<MExplosionMateriales.DetalleCliente> _lisdetalle = new List<MExplosionMateriales.DetalleCliente>();
        public List<MExplosionMateriales.DetalleCliente> lisdetalle
        {
            get { return _lisdetalle; }
            set { _lisdetalle = value; base.OnPropertyChanged("lisdetalle"); }
        }

        private string _strCodigoPrv;
        public string strCodigoPrv
        {
            get { return _strCodigoPrv; }
            set { _strCodigoPrv = value; base.OnPropertyChanged("strCodigoPrv"); }
        }

        private string _strNombrePrv;
        public string strNombrePrv
        {
            get { return _strNombrePrv; }
            set { _strNombrePrv = value; base.OnPropertyChanged("strNombrePrv"); }
        }

        private Boolean _logValido=true;
        public Boolean logValido
        {
            get { return _logValido; }
            set { _logValido = value; base.OnPropertyChanged("logValido"); }
        }

        private Boolean _logProcesado = true;
        public Boolean logProcesado
        {
            get { return _logProcesado; }
            set { _logProcesado = value; base.OnPropertyChanged("logProcesado"); }
        }

        private Boolean _logConcepto = true;
        public Boolean logConcepto
        {
            get { return _logConcepto; }
            set { _logConcepto = value; base.OnPropertyChanged("logConcepto"); }
        }

        
        private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn
        {
            get { return _msn; }
            set { _msn = value; base.OnPropertyChanged("msn"); }
        }

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
        }

        private Boolean _IsOpenResumen = false;
        public Boolean IsOpenResumen
        {
            get { return _IsOpenResumen; }
            set { _IsOpenResumen = value; base.OnPropertyChanged("IsOpenResumen"); }
        }

        private Boolean _IsOpenDetalle = false;
        public Boolean IsOpenDetalle
        {
            get { return _IsOpenDetalle; }
            set { _IsOpenDetalle = value; base.OnPropertyChanged("IsOpenDetalle"); }
        }

        private Boolean _IsOpenDetalleExplosion = false;
        public Boolean IsOpenDetalleExplosion
        {
            get { return _IsOpenDetalleExplosion; }
            set { _IsOpenDetalleExplosion = value; base.OnPropertyChanged("IsOpenDetalleExplosion"); }
        }

        private Boolean _logTodos = true;
        public Boolean logTodos
        {
            get { return _logTodos; }
            set
            {
                _logTodos = value;
                if (_logTodos)
                {
                    selTodoslosColores();
                }
                else
                {
                    selNingunColor();
                }
                base.OnPropertyChanged("logTodos");
            }
        }

        private string _strCodigoCliente;
        public string strCodigoCliente
        {
            get { return _strCodigoCliente; }
            set { _strCodigoCliente = value; base.OnPropertyChanged("strCodigoCliente"); }
        }

        private Int32 _numPedido;
        public Int32 numPedido
        {
            get { return _numPedido; }
            set { _numPedido = value; base.OnPropertyChanged("numPedido"); }
        }

        private DateTime _dtmFecha;
        public DateTime dtmFecha
        {
            get { return _dtmFecha; }
            set { _dtmFecha = value; base.OnPropertyChanged("dtmFecha"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; base.OnPropertyChanged("visorFotoReferencia"); }
        }


        #endregion

        #region Metodos

        void cargarGrupos()
        {
            try
            {
                CLSMAEGRP gr = new CLSMAEGRP();
                grupos = gr.listaGrupos();
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void cargarSubgrupos()
        {
            try
            {
                subgrupos = new CLSMAESUB { CODGRP_SUB = selgrupo.CODGRP_GRP }.listaSubg();
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void limpiar()
        {
            try
            {
                logConSustitutos = false;
                selgrupo = null;
                selsubgrupo = null;
                strConcepto = null;
                numExplosion = 0;
                strLisPed = "";
                logProcesado = true;
                lisdetallepedido.Clear();
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void procesar()
        {
            try
            {
                int numCanti = 0;
                Int32 numExplo = 0;

                if (selgrupo != null)
                {
                    if (selgrupo.CODGRP_GRP !=null)
                        strgru = selgrupo.CODGRP_GRP;
                }

                if (selsubgrupo != null)
                {
                    if (selsubgrupo.CODSUB_SUB != null)
                        strsubgru = selsubgrupo.CODSUB_SUB;
                }

                foreach (VMPedidos xx in lispedidos)
                {
                    numCanti++;
                    strLisPed = strLisPed + xx.strCodigo.Trim() + "-";
                }
                if (numCanti > 0)
                {
                    grabarenTemporal();

                    lisexplosion = _repositorio.consultaExplosionM(strLisPed, strgru, strsubgru, logConSustitutos, strConcepto, out numExplo);
                    numExplosion = numExplo;
                    if (numExplosion > 0)
                    {
                        msn.texto = "Explosión de materiales generada con exito.";
                        msn.tipo = true;
                        logProcesado = false;
                        logConcepto = false;
                        logValido = false;

                        base.OnPropertyChanged("lisexplosion");
                        base.OnPropertyChanged("numExplosion");
                    }
                    else
                    {
                        msn.texto = "La explosión de materiales no se pudo generar.";
                        msn.tipo = false;

                        logProcesado = true;
                        logConcepto = true;
                        logValido = true;
                    }
                    
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); msn.texto = ex.Message; msn.tipo = false; }
        }

        void grabarenTemporal()
        {
            try
            {
                List<MExplosionMateriales.DetallePedido> lstAgregar = (from con in lisDetallePedidoDefinitivo select con.getDetallePedidos()).ToList();
                if (_repositorio.guardarDetalleExplosion(lstAgregar))
                {
                    msn.texto = "La información del detalle de la explosión se guardo con exito";
                    msn.tipo = true;
                }
                else
                {
                    msn.texto = "La información del detalle de la explosión no se guardo.";
                    msn.tipo = false;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void imprimir()
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptExplosiondeMateriales.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - CargamosLosDatosQueSeVanAImprimir
                    if (MDOgeneral.DtExplosiondeMateriales == null)//FJRF - Verificamos si existen datos de la consulta que se va a imprimir y si no hay datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                        return;//FJRF - Nos salimos
                    }
                    else//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtImprimir = new DataTable("DtDatosReporte");
                        DtImprimir = MDOgeneral.DtExplosiondeMateriales.Copy();//FJRF - Hacemos una copia de los datos
                        DtImprimir.TableName = "DtDatosReporte";//FJRF - Renombramos la tabla
                    }
                    #endregion

                    #region FJRF - ImprimimosElReporte
                    CargarParametrosImpresion();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport

                    DsImprimir = new DataSet("dsExplosiondeMateriales");//FJRF - DataSet que esta vinculado al CrystalReport

                    //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                    DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                    DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe

                    produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                    vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    #endregion

                    ImprimirConsultaExplosionDeMateriales(StrNumeroDeExplosionSeleccionada);//FJRF - Imprimimos el segundo reporte
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        private void CargarParametrosImpresion()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrNombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("StrGrupo", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrSubGrupo", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte

            DtEncabezadoYParametros.Columns.Add("StrConSustituto", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrConcepto", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrExplosion", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte

            DtEncabezadoYParametros.Columns.Add("StrPedidos", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrNombreEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrTituloReporte"] = "EXPLOSIÓN DE MATERIALES";//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrGrupo"] = strgru;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrSubGrupo"] = strsubgru;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            String StrConSustitulo = "";
            if (logConSustitutos == false)
            {
                StrConSustitulo = "SI";
            }
            else
            {
                StrConSustitulo = "NO";
            }

            drEncabezadoYParametros["StrConSustituto"] = StrConSustitulo;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrConcepto"] = strConcepto;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrExplosion"] = numExplosion;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            StrNumeroDeExplosionSeleccionada = numExplosion.ToString();//FJRF - Cargamos el numero de la explocion seleccionada

            StrNumeroDePedidos = strLisPed;//FJRF - Enviamos los pedidos
            drEncabezadoYParametros["StrPedidos"] = strLisPed;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion

            EjecutarSp_INFCONSPEDIDOSEXPLOSION(numExplosion.ToString());//FJRF - Ejecutamos el Sp para el segundo reporte
        }
        private void ImprimirConsultaExplosionDeMateriales(String StrNumeroExplosion)
        {
            try//FJRF - Validamos el proceso de impresion 
            {
                String StrRutaReporteAImprimir = StrRutaReporteCrystalReport + "rptConsultaDeExplosiones.rpt";//FJRF - Armamos la ruta completa donde estara el reporte
                if (System.IO.File.Exists(StrRutaReporteAImprimir) == true)//FJRf - Si el reporte existe hacemos lo siguiente
                {
                    #region FJRF - CargamosLosDatosQueSeVanAImprimir
                    if (DtConsultaReferencias == null)//FJRF - Verificamos si existen datos de la consulta que se va a imprimir y si no hay datos hacemos lo siguiente
                    {
                        Msgbox("PROCESO CANCELADO", "No existen datos para imprimir el reporte", MessageBoxButton.OK, MessageBoxImage.Error); //FJRF - Informamos al usuario
                        return;//FJRF - Nos salimos
                    }
                    else//FJRF - Si hay datos hacemos lo siguiente
                    {
                        DtImprimir = new DataTable("DtDatosReporte");
                        DtImprimir = DtConsultaReferencias.Copy();//FJRF - Hacemos una copia de los datos
                        DtImprimir.TableName = "DtDatosReporte";//FJRF - Renombramos la tabla
                    }
                    #endregion

                    #region FJRF - ImprimimosElReporte
                    CargarParametrosImpresion2();//FJRF - Cargamos los parametros para la impresion, esto contiene titulo y parametros enviados al cystalreport
                    CargarTituloTallasReporte();//FJRF - Cargamos los nuevos titulos de las tallas

                    DsImprimir = new DataSet("dsConsultaDeExplosiones");//FJRF - DataSet que esta vinculado al CrystalReport

                    //FJRF - ADICIONAMOS LAS TABLAS QUE NECESITE EL DATASET ASOCIADO AL CRYSTAL
                    DsImprimir.Tables.Add(DtEncabezadoYParametros.Copy());//Encabezado Informe
                    DsImprimir.Tables.Add(DtImprimir.Copy());//Detalle del Informe
                    DsImprimir.Tables.Add(DtTituloTallasReporte.Copy());//Titulo de tallas

                    produccion.reportes.Vista vista = new produccion.reportes.Vista { ds = DsImprimir, reporte = StrRutaReporteAImprimir };//FJRF - Enviamos los datos para que se imprima el reporte
                    vista.Show();//FJRF - Ejecutamos el reporte para que se muestre visualmente
                    #endregion
                }
                else//FJRF - Si el reporte no existe hacemos lo siguiente
                {
                    Msgbox("PROCESO CANCELADO", "El reporte no existe en la ruta: [" + StrRutaReporteAImprimir + "] por favor comuniquese con el administrador del sistema para que corriga este inconveniente.", MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
                }
            }
            catch (Exception ex)//FJRF - Si se presenta algun error hacemos lo siguiente
            {
                Msgbox("PROCESO CANCELADO - [Error del sistema]", ex.Message.ToString(), MessageBoxButton.OK, MessageBoxImage.Error);//FJRF - Enviamos un mensaje al usuario
            }
        }
        String StrNumeroDeExplosionSeleccionada, StrConsulta, StrNumeroDePedidos;
        DataTable DtConsulta, DtConsultaReferencias, DtTituloTallasReporte;
        private void EjecutarSp_INFCONSPEDIDOSEXPLOSION(string strNumeroExprosion)//FJRF - Este procedimiento ejecuta un sp
        {
            try
            {
                StrNumeroDeExplosionSeleccionada = strNumeroExprosion;//FJRF - Cargamos en una varible global del formulario el numero de explosion para q pueda ser manipilada en otro lado

                #region FJRF - Ejecutamos el Sp principal
                MDOgeneral.spComando.CommandText = "SP_INFCONSPEDIDOSEXPLOSION";
                MDOgeneral.spComando.Connection = MDOgeneral.conexion;
                MDOgeneral.spComando.CommandType = CommandType.StoredProcedure;
                MDOgeneral.spComando.Parameters.Clear();

                //Input
                MDOgeneral.spComando.Parameters.Add("pnu_nroexp", Oracle.DataAccess.Client.OracleDbType.Int32).Value = Int32.Parse(strNumeroExprosion);

                //Output salidas
                MDOgeneral.spComando.Parameters.Add("pva_result", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.Parameters.Add("pva_errusu", Oracle.DataAccess.Client.OracleDbType.Varchar2, 2000).Direction = ParameterDirection.Output;
                MDOgeneral.spComando.ExecuteNonQuery();
                #endregion

                #region FJRF - Buscamos el tallaje y lo asiganamos en variables
                String StrTallaje = "";//FJRF - Varible que contendra el codigo de tallaje que se esta usando
                DtConsulta = MdoGeneral.consulta("SELECT CODTAL_TLE FROM TMPLISEXIP GROUP BY CODTAL_TLE");//FJRF - Buscamos los datos

                StrTallaje = DtConsulta.Rows[0][0].ToString();//FJRF - Extraemos el tallaje
                //MdoGeneral.CargarTitulosTallasEnVariables(StrTallaje);//FJRF - Cargamos los tallajes en variables 
                #endregion

                #region FJRF - Consultamos los datos retornados por el sp
                StrConsulta = "SELECT ";//FJRF - Seleccionamos
                //FJRF - PRIMEROS DATOS ANTES DE LAS TALLAS
                StrConsulta = StrConsulta + "(CODREF_TLE || CODCOL_TLE) AS CODIGO,  NOMREF_TLE AS REFERENCIA,  NOMCOL_TLE AS COLOR,  TOTAL_TLE AS TOTAL,  ";//FJRF - Los campos con los que trabajaremos
                //FJRF - TALLAS INICIO
                StrConsulta = StrConsulta + "T1_TLE AS T1,  T2_TLE AS T2,  T3_TLE AS T3,  T4_TLE AS T4,  T5_TLE AS T5,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "T6_TLE AS T6,  T7_TLE AS T7,  T8_TLE AS T8,  T9_TLE AS T9,  T10_TLE AS T10, ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "T11_TLE AS T11,  T12_TLE AS T12,  T13_TLE AS T13,  T14_TLE AS T14,  T15_TLE AS T15,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "T16_TLE AS T16,  T17_TLE AS T17,  T18_TLE AS T18,  T19_TLE AS T19,  T20_TLE AS T20 ";//FJRF - Los campos con los que trabajaremos

                //FJRF - OTROS DATOS
                StrConsulta = StrConsulta + ", CODTAL_TLE AS TAL, TOTR_TLE AS TOTR, CODLIN_TLE AS CODLIN,  NOMLIN_TLE AS LINEA, CLSREF_TLE AS CLSREF,  PREREF_TLE AS PREREF,  TOTCOS_TLE AS TOTCOS,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "CODMAR_TLE AS CODMAR,  NOMMAR_TLE AS NOMMAR,  POSBOD_TLE AS POSBOD,  COSREF_TLE AS COSREF,  ";//FJRF - Los campos con los que trabajaremos
                StrConsulta = StrConsulta + "TOTCANLIN_TLE AS TOTCANLIN,  TOTCOSLIN_TLE AS TOTCOSLIN,  TOTPRELIN_TLE AS TOTPRELIN,  TOTPRE_TLE AS TOTPRE,  TOTREF_TLE AS TOTREF ";//FJRF - Los campos con los que trabajaremos
                //TABLA
                StrConsulta = StrConsulta + "FROM TMPLISEXIP ";//FJRF - Las tablas que contienen los campos
                //FJRF - ORDENAMIENTO
                StrConsulta = StrConsulta + "ORDER BY CODREF_TLE, CODCOL_TLE ";//FJRF - Ordenamos los datos encontrados

                DtConsultaReferencias = MdoGeneral.consulta(StrConsulta);//FJRF - Buscamos los datos

                DataGrid DtgReferencias = new DataGrid();
                DtgReferencias.ItemsSource = DtConsultaReferencias.DefaultView;//FJRF - Asignamos los datos encontrados
                #endregion

                MdoGeneral.ModificarTallasTituloGrid(DtgReferencias, StrTallaje, 4);//FJRF - Modificamos el titulo de las tallas
            }
            catch (Exception ex) { throw ex; }
        }
        private void CargarParametrosImpresion2()
        {
            #region FJRF - CreamosLasColmnasDelEncabezado
            DtEncabezadoYParametros = new DataTable("DtEncabezadoYParametros");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS COLUMNAS DE LOS PARAMETROS A ENVIAR
            DtEncabezadoYParametros.Columns.Add("StrNombreEmpresa", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtEncabezadoYParametros.Columns.Add("StrTituloReporte", System.Type.GetType("System.String"));//FJRF - El titulo que tendra el reporte

            DtEncabezadoYParametros.Columns.Add("StrExplosion", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            DtEncabezadoYParametros.Columns.Add("StrPedidos", System.Type.GetType("System.String"));//FJRF - Parametro que envia el sistema para la generacion del reporte
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drEncabezadoYParametros;//FJRF - Creamos un manejador de filas para el DataTable actual

            drEncabezadoYParametros = DtEncabezadoYParametros.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drEncabezadoYParametros["StrNombreEmpresa"] = MDOgeneral.strEmpresaImprime;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrTituloReporte"] = "CONSULTA DE EXPLOSIONES";//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drEncabezadoYParametros["StrExplosion"] = StrNumeroDeExplosionSeleccionada;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drEncabezadoYParametros["StrPedidos"] = StrNumeroDePedidos.Trim();//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtEncabezadoYParametros.Rows.Add(drEncabezadoYParametros);//FJRF - Agregamos a la tabla el registro creado
            DtEncabezadoYParametros.TableName = "DtEncabezadoYParametros";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }
        private void CargarTituloTallasReporte()
        {
            #region FJRF - CreamosLasColumnasDelosTitulos
            DtTituloTallasReporte = new DataTable("DtTituloTallasReporte");//FJRF - Creamos la tabla que contendra el encabezado del informe

            //FJRF - CREAMOS LAS TITULOS DE LAS COLUMNAS
            DtTituloTallasReporte.Columns.Add("T1", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T2", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T3", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T4", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T5", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T6", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T7", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T8", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T9", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T10", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa

            DtTituloTallasReporte.Columns.Add("T11", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T12", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T13", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T14", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T15", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T16", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T17", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T18", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T19", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            DtTituloTallasReporte.Columns.Add("T20", System.Type.GetType("System.String"));//FJRF - Este es el nombre de la empresa
            #endregion

            #region FJRF - AsignamosEnLasColmnasDelEncabezadoLosValores

            DataRow drTituloTallasReporte;//FJRF - Creamos un manejador de filas para el DataTable actual

            drTituloTallasReporte = DtTituloTallasReporte.NewRow();//FJRF - Agregamos una nueva fila
            //FJRF - ASIGNAMOS LOS VALORES
            drTituloTallasReporte["T1"] = MDOgeneral.StrNuevoTituloTalla1;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T2"] = MDOgeneral.StrNuevoTituloTalla2;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T3"] = MDOgeneral.StrNuevoTituloTalla3;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T4"] = MDOgeneral.StrNuevoTituloTalla4;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T5"] = MDOgeneral.StrNuevoTituloTalla5;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T6"] = MDOgeneral.StrNuevoTituloTalla6;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T7"] = MDOgeneral.StrNuevoTituloTalla7;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T8"] = MDOgeneral.StrNuevoTituloTalla8;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T9"] = MDOgeneral.StrNuevoTituloTalla9;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T10"] = MDOgeneral.StrNuevoTituloTalla10;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            drTituloTallasReporte["T11"] = MDOgeneral.StrNuevoTituloTalla11;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T12"] = MDOgeneral.StrNuevoTituloTalla12;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T13"] = MDOgeneral.StrNuevoTituloTalla13;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T14"] = MDOgeneral.StrNuevoTituloTalla14;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T15"] = MDOgeneral.StrNuevoTituloTalla15;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T16"] = MDOgeneral.StrNuevoTituloTalla16;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T17"] = MDOgeneral.StrNuevoTituloTalla17;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T18"] = MDOgeneral.StrNuevoTituloTalla18;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T19"] = MDOgeneral.StrNuevoTituloTalla19;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario
            drTituloTallasReporte["T20"] = MDOgeneral.StrNuevoTituloTalla20;//Enviamos el parametro que requerimos cargar este parametro varia segun la necesidad del formulario

            DtTituloTallasReporte.Rows.Add(drTituloTallasReporte);//FJRF - Agregamos a la tabla el registro creado
            DtTituloTallasReporte.TableName = "DtTituloTallasReporte";//FJRF - Le damos un nombre a la tabla creada para poder verla en el DataSet
            #endregion
        }


        #region FJRF - CajaDeTextoMsgbox
        protected void Msgbox(String StrCaption, String StrMensaje, MessageBoxButton MsbTipoBoton, MessageBoxImage MsbTipoImagenIcono)
        {
            MessageBoxButton buttons;
            buttons = MsbTipoBoton;

            MessageBoxImage icon = MsbTipoImagenIcono;
            MessageBox.Show(StrMensaje, StrCaption, buttons, icon);
        }
        #endregion

        void grabarLista()
        {
            try
            {
                VMDetallePedido objDetalle = new VMDetallePedido();
                foreach (VMDetallePedido ped in lisdetallepedido)
                {
                    objDetalle = new VMDetallePedido();

                    if (ped.logIncluir == true)
                    {
                        objDetalle.strReferencia = ped.strReferencia;
                        objDetalle.strNombreReferencia = ped.strNombreReferencia;
                        objDetalle.strColor = ped.strColor;
                        objDetalle.strNombreColor = ped.strNombreColor;
                        objDetalle.numCantidad = ped.numCantidad;
                        objDetalle.strTieneStandard = ped.strTieneStandard;
                        objDetalle.strTieneExplosion = ped.strTieneExplosion;
                        objDetalle.strNumeroExplosion = ped.strNumeroExplosion;
                        objDetalle.logIncluir = ped.logIncluir;
                        objDetalle.strCodCli = ped.strCodCli;
                        objDetalle.numPed = ped.numPed;
                        objDetalle.dtmFec = ped.dtmFec;
                        objDetalle.logPuedeIncluir = ped.logPuedeIncluir;
                        dtmFecha = ped.dtmFec;

                        lisDetallePedidoDefinitivo.Add(objDetalle);
                    }
                }

                lisdetallepedido.Clear();
                IsOpenDetalleExplosion = false;
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void verOrdendeCompra()
        {
            try
            {
                var res = (from all in lisexplosion
                            where all.numCantidadaPedir > 0
                            group all by new { all.strCodigoProveedor, all.strNombreProveedor }
                                into gp
                                select new MExplosionMateriales.ResumenExplosion()
                                {
                                    strCodigoProveedor = gp.Key.strCodigoProveedor,
                                    strNombreProveedor = gp.Key.strNombreProveedor,
                                    numTotalUnidades = gp.Sum(t => t.numCantidadaPedir),
                                    numCostoTotal = gp.Sum(t => t.numCostoMaterial * t.numCantidadaPedir)
                                }).OrderBy(x => x.strNombreProveedor).ToList();

                int numCanti = 0;
                foreach (var item in res)
                {
                    numCanti = numCanti + 1;
                }

                IsOpenResumen = true;
                lisresumen.Clear();
                lisresumen = new List<MExplosionMateriales.ResumenExplosion>(res);
                base.OnPropertyChanged("lisresumen");
                base.OnPropertyChanged("lisexplosion");

            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void verDetalle()
        {
            try
            {
                strCodigoPrv = sellisresumen.strCodigoProveedor;
                strNombrePrv = sellisresumen.strNombreProveedor;

                var res1 = (from all in lisexplosion
                            where all.strCodigoProveedor.Equals(strCodigoPrv) && all.numCantidadaPedir > 0
                            group all by new { all.strCodigoProveedor, all.strNombreProveedor, all.strCodigoMaterial, all.strNombreMaterial, all.strNombreColor, all.numCostoMaterial }
                                into gp
                                select new MExplosionMateriales.DetalleCliente()
                                {
                                    strCodigoMaterial = gp.Key.strCodigoMaterial,
                                    strDescripcion = gp.Key.strNombreMaterial,
                                    strColor = gp.Key.strNombreColor,
                                    numCantidad = gp.Sum(t => t.numCantidadaPedir),
                                    numCosto = gp.Key.numCostoMaterial,
                                    numTotal = gp.Sum(t => t.numCostoMaterial * t.numCantidadaPedir)

                                }).OrderBy(x => x.strDescripcion).ToList();

                int numCantidad = 0;
                foreach (var item in res1)
                {
                    numCantidad = numCantidad + 1;
                }

                lisdetalle.Clear();
                lisdetalle = new List<MExplosionMateriales.DetalleCliente>(res1);
                base.OnPropertyChanged("lisdetalle");

                IsOpenDetalle = true;
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void reversar()
        {
            try
            {
                Mouse.OverrideCursor = Cursors.Wait;

                if (_repositorio.reversarExplosionM(numExplosion))
                {
                    msn.texto = "Explosión de materiales Reversada con exito.";
                    msn.tipo = true;
                }
                else
                {
                    msn.texto = "La explosión de materiales no se pudo reversar.";
                    msn.tipo = false;
                }
                limpiarForm();

                Mouse.OverrideCursor = Cursors.Arrow;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); msn.texto = ex.Message; msn.tipo = false; }
        }

        void limpiarForm()
        {
            try
            {
                lisexplosion.Clear();
                logConSustitutos = false;
                selgrupo = null;
                selsubgrupo = null;
                lispedidos.Clear();
                lisresumen.Clear();
                logValido = true;
                logConcepto = true;
                logProcesado = true;
                strConcepto = null;
                numExplosion = 0;
                strLisPed = "";
                strgru = " ";
                strsubgru = " ";
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            try
            {
                if (e.NewItems != null && e.NewItems.Count > 0)
                {
                    foreach (VMPedidos ped in e.NewItems)
                    {
                        ped.validarPedido += validaPedido;
                        ped.PropertyChanged += OnPropertyChanged;
                    }
                }

            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        public string validaPedido(string strCodigo)
        {
            try
            {
                int i = (from ped in lispedidos where ped.strCodigo.Trim().Equals(strCodigo.Trim()) select ped).ToList().Count();
                if (i > 1)
                {
                    return "Pedido ya existe o ya fue ingresado";
                }
                consultarPedido(strCodigo);

            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        void OnPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            logValido = ((from ped in lispedidos where ped.IsValid.Equals(false) select ped.IsValid).ToList().Count()) > 0 ? true : false;
        }

        void limpiarPedidos()
        {
            try
            {
                lispedidos.Clear();
                selgrupo = null;
                selsubgrupo = null;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        public void Salir2()
        {
            IsOpenResumen = false;
        }

        public void Salir3()
        {
            IsOpenDetalle = false;
        }

        public void SalirX()
        {
            lisdetallepedido.Clear();
            IsOpenDetalleExplosion = false;
        }

        public void Salir(Object frmformulario)
        {
            ((Window)frmformulario).Close();
        }

        private void selTodoslosColores()
        {
            foreach (VMDetallePedido det in lisdetallepedido)
            {
                if (det.strTieneStandard=="S" && det.logPuedeIncluir)
                    det.logIncluir = true;
            }
        }

        private void selNingunColor()
        {
            foreach (VMDetallePedido det in lisdetallepedido)
            {
                det.logIncluir = false;
            }
        }

        public void consultarPedido(string strPedido)
        {
            if (strPedido.Length == 7)
            {
                Int32 numPedidoCli = 0;
                string strCodCli = "";
                bool canConvert = Int32.TryParse(strPedido.Substring(3, 4), out numPedidoCli);
                strCodCli = strPedido.Substring(0, 3);

                if (lisdetallepedido.Count > 0)
                {
                    int i = (from ped in lisdetallepedido where ped.numPed.Equals(numPedidoCli) && ped.strCodCli.Equals(strCodCli) select ped).ToList().Count();
                    if (i > 0)
                    {
                        return;
                    }
                }

                if (lisDetallePedidoDefinitivo.Count>0)
                {
                    int i = (from ped in lisDetallePedidoDefinitivo where ped.numPed.Equals(numPedidoCli) && ped.strCodCli.Equals(strCodCli) select ped).ToList().Count();
                    if (i > 0)
                    {
                        return;
                    }
                }

                DataTable dt = _repositorio.consultarDetallePedidoExplosionM(strCodCli, numPedidoCli);

                if (dt.Rows.Count > 0)
                {
                    strCodigoCliente = strCodCli;
                    numPedido = numPedidoCli;

                    VMDetallePedido objDetalle = new VMDetallePedido();

                    foreach (DataRow r in dt.Rows)
                    {
                        objDetalle = new VMDetallePedido();

                        objDetalle.strReferencia = r["CODREF_TMP"].ToString();
                        objDetalle.strNombreReferencia = r["NOMREF_TMP"].ToString();
                        objDetalle.strColor = r["CODCOL_TMP"].ToString();
                        objDetalle.strNombreColor = r["NOMCOL_TMP"].ToString();
                        objDetalle.numCantidad = Convert.ToInt32(r["CANPRO_TMP"]);
                        objDetalle.strTieneStandard = r["STANDARD_TMP"].ToString();
                        objDetalle.strTieneExplosion = r["EXPLOSION_TMP"].ToString();
                        objDetalle.strNumeroExplosion = r["NROEXPLOSION_TMP"].ToString();
                        objDetalle.strCodCli = r["CODCLI_TMP"].ToString();
                        objDetalle.numPed = Convert.ToInt32(r["NROPED_TMP"]);
                        objDetalle.dtmFec = Convert.ToDateTime(r["FECPED_TMP"]);
                        if (r["STANDARD_TMP"].ToString().Trim() == "N" || r["EXPLOSION_TMP"].ToString().Trim() == "S")
                        {
                            objDetalle.logIncluir = false;
                            objDetalle.logPuedeIncluir = false;
                        }
                        else
                        {
                            objDetalle.logPuedeIncluir = true;
                            objDetalle.logIncluir = true;
                        }

                        dtmFecha = Convert.ToDateTime(r["FECPED_TMP"]);

                        lisdetallepedido.Add(objDetalle);
                    }

                    IsOpenDetalleExplosion = true;
                }
            }

        }

        #endregion

        #region Comandos

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {
                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }

        RelayCommand _cmdSalir2;
        public ICommand cmdSalir2
        {
            get
            {
                if (_cmdSalir2 == null)
                {
                    _cmdSalir2 = new RelayCommand(r => Salir2());
                }
                return _cmdSalir2;
            }
        }

        RelayCommand _cmdSalir3;
        public ICommand cmdSalir3
        {
            get
            {
                if (_cmdSalir3 == null)
                {
                    _cmdSalir3 = new RelayCommand(r => Salir3());
                }
                return _cmdSalir3;
            }
        }

        RelayCommand _cmdSalirX;
        public ICommand cmdSalirX
        {
            get
            {
                if (_cmdSalirX == null)
                {
                    _cmdSalirX = new RelayCommand(r => SalirX());
                }
                return _cmdSalirX;
            }
        }

        RelayCommand _cmdLimpiar;
        public ICommand cmdLimpiar
        {
            get
            {
                if (_cmdLimpiar == null)
                {
                    _cmdLimpiar = new RelayCommand(r => limpiar());
                }
                return _cmdLimpiar;
            }
        }

        RelayCommand _cmdProcesar;
        public ICommand cmdProcesar
        {
            get
            {
                if (_cmdProcesar == null)
                {
                    _cmdProcesar = new RelayCommand(r => procesar());
                }
                return _cmdProcesar;
            }
        }

        RelayCommand _cmdGuardar;
        public ICommand cmdGuardar
        {
            get
            {
                if (_cmdGuardar == null)
                {
                    _cmdGuardar = new RelayCommand(r => grabarLista());
                }
                return _cmdGuardar;
            }
        }

        RelayCommand _cmdImprimir;
        public ICommand cmdImprimir
        {
            get
            {
                if (_cmdImprimir == null)
                {
                    _cmdImprimir = new RelayCommand(r => imprimir());
                }
                return _cmdImprimir;
            }
        }

        RelayCommand _cmdVerOC;
        public ICommand cmdVerOC
        {
            get
            {
                if (_cmdVerOC == null)
                {
                    _cmdVerOC = new RelayCommand(r => verOrdendeCompra());
                }
                return _cmdVerOC;
            }
        }

        RelayCommand _cmdVerDetalle;
        public ICommand cmdVerDetalle
        {
            get
            {
                if (_cmdVerDetalle == null)
                {
                    _cmdVerDetalle = new RelayCommand(r => verDetalle());
                }
                return _cmdVerDetalle;
            }
        }

        RelayCommand _cmdReversar;
        public ICommand cmdReversar
        {
            get
            {
                if (_cmdReversar == null)
                {
                    _cmdReversar = new RelayCommand(r => reversar());
                }
                return _cmdReversar;
            }
        }

        RelayCommand _cmdLimpiarForm;
        public ICommand cmdLimpiarForm
        {
            get
            {
                if (_cmdLimpiarForm == null)
                {
                    _cmdLimpiarForm = new RelayCommand(r => limpiarForm());
                }
                return _cmdLimpiarForm;
            }
        }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        /// 

        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;

                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
                    { 
                        "strConcepto"
                    };

        string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {
                case "strConcepto":
                    error = this.ValidateConcepto();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }
            return error;
        }

        string ValidateConcepto()
        {
            try
            {
                if (strConcepto != null)
                {
                    if (strConcepto.Length < 4)
                    {
                        return "Debe agregar un concepto valido a la explosión de materiales. ";
                    }
                }
                else
                {
                    return "Debe agregar un concepto a la explosión de materiales. ";
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        #endregion
    }

    public class VMPedidos : ViewModelBase, IDataErrorInfo
    {

        #region Campos

            private MExplosionMateriales.Pedidos _pedidos =  new MExplosionMateriales.Pedidos();
            private ProcesoProduccionRepositorio _rep = new ProcesoProduccionRepositorio();

        #endregion

        #region Constructor

            public VMPedidos(MExplosionMateriales.Pedidos pedidos)
            {
                _pedidos = pedidos;
            }

            public VMPedidos()
            {
                agregar = true;
            }

        #endregion

        #region Metodos

            public MExplosionMateriales.Pedidos getPedidos()
            {
                return _pedidos;
            }

            public void consultarPedido()
            {
                MDOgeneral _mdo = new MDOgeneral();

                Int32 number1 = 0;
                string strCodCli = "";
                bool canConvert = Int32.TryParse(strCodigo.Substring(3, 4), out number1);
                strCodCli = strCodigo.Substring(0, 3);

                string query = "select b.nomcli_cli, a.fecped_epc from encppcp a inner join maeclip b on a.codcli_epc = b.codcli_cli where b.codcli_cli = '" + strCodCli + "' and a.nroped_epc = " + number1;
                DataTable dt = _mdo.consulta(query);

                if (dt.Rows.Count == 0)
                {
                    strCodCli = "";
                    strNombre = null;
                    dtmFecha = DateTime.Now;
                    MessageBox.Show("Pedido no Existe!!", "Vuelva a ingresar el pedido", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK);
                }
                else
                {

                    foreach (DataRow r in dt.Rows)
                    {
                        strNombre = r["NOMCLI_CLI"].ToString();
                        dtmFecha = Convert.ToDateTime(r["FECPED_EPC"]);
                        strIncluido = "";
                        base.OnPropertyChanged("strNombre");
                        base.OnPropertyChanged("dtmFecha");
                    }
                }
            }

            public delegate string ValidarPedido(string strCodigo);

        #endregion

        #region Interfaces publicas

            public ValidarPedido validarPedido { get; set; }    

            public string strCodigo
            {
                get { return _pedidos.strCodigo; }
                set 
                { 
                    if (value != null)
                    {
                        if (value.Length > 0)
                        {
                            _pedidos.strCodigo = value.ToUpper();
                            if (value.Length == 7)
                            {
                                Int32 number1 = 0;
                                bool canConvert = Int32.TryParse(value.Substring(3, 4), out number1);
                                if (canConvert == true)
                                    consultarPedido();
                            }
                        }
                        else
                            _pedidos.strCodigo = "";
                    }
                    base.OnPropertyChanged("strCodigo"); 
                }
            }

            public string strNombre
            {
                get { return _pedidos.strNombre; }
                set { _pedidos.strNombre = value; base.OnPropertyChanged("strNombre"); }
            }

            public DateTime dtmFecha
            {
                get { return _pedidos.dtmFecha; }
                set { _pedidos.dtmFecha = value; base.OnPropertyChanged("dtmFecha"); }
            }

            public string strIncluido
            {
                get { return _pedidos.strIncluido; }
                set { _pedidos.strIncluido = value; base.OnPropertyChanged("strIncluido"); }
            }

            private bool _actualizar = false;
            public bool actualizar
            {
                get { return _actualizar; }
                set { _actualizar = value; base.OnPropertyChanged("actualizar"); }
            }

            private bool _eliminar = false;
            public bool eliminar
            {
                get { return _eliminar; }
                set { _eliminar = value; base.OnPropertyChanged("eliminar"); }
            }

            private bool _agregar = false;
            public bool agregar
            {
                get { return _agregar; }
                set { _agregar = value; base.OnPropertyChanged("agregar"); }
            }


        #endregion

        #region IDataErrorInfo Members

            string IDataErrorInfo.Error { get { return null; } }

            string IDataErrorInfo.this[string propertyName]
            {
                get { return this.GetValidationError(propertyName); }
            }

        #endregion

        #region Validation

            /// <summary>
            /// Returns true if this object has no validation errors.
            /// </summary>
            /// 

            public bool IsValid
            {
                get
                {
                    foreach (string property in ValidatedProperties)
                        if (GetValidationError(property) != null)
                            return false;

                    return true;
                }
            }

            static readonly string[] ValidatedProperties = 
                    { 
                        "strCodigo"
                    };

            string GetValidationError(string propertyName)
            {
                if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                    return null;

                string error = null;

                switch (propertyName)
                {
                    case "strCodigo":
                        error = this.ValidateCodigo();
                        break;
                    default:
                        Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                        break;
                }
                return error;
            }

            string ValidateCodigo()
            {
                try
                {
                    if (strCodigo != null)
                    {
                        if (strCodigo.Length == 7)
                        {
                            Int32 number1 = 0;
                            bool canConvert = Int32.TryParse(strCodigo.Substring(3, 4), out number1);
                            if (canConvert == false)
                                return "El pedido debe contener el codigo del cliente y 4 digitos del numero del pedido. ";

                            if (strNombre == null)
                            {
                                return "El pedido no existe para ese cliente.";
                            }

                            if (strNombre.Length < 3)
                                return "Cliente no valido.";

                            string error = null;
                            error = validarPedido(strCodigo);
                            if (!String.IsNullOrEmpty(error))
                            {
                                return error;
                            }

                            return null;
                        }
                        else
                        {
                            if (strCodigo.Trim().Length < 1)
                                return null;
                            else
                                return "El pedido debe contener el codigo del cliente y 4 digitos del numero del pedido. ";
                        }
                    }
                    else
                    {
                        if (String.IsNullOrEmpty(strCodigo))
                            return null;
                        else
                            return "El pedido debe contener el codigo del cliente y 4 digitos del numero del pedido. ";
                    }

                }
                catch (Exception ex) { MessageBox.Show(ex.Message); }
                return null;
            }

        #endregion

    }

    public class VMDetallePedido : ViewModelBase, IDataErrorInfo
    {

        #region Campos

        private MExplosionMateriales.DetallePedido _detpedidos = new MExplosionMateriales.DetallePedido();
        private ProcesoProduccionRepositorio _rep = new ProcesoProduccionRepositorio();

        #endregion

        #region Constructor

        public VMDetallePedido(MExplosionMateriales.DetallePedido detpedidos)
        {
            _detpedidos = detpedidos;
        }

        public VMDetallePedido()
        {
         
        }

        #endregion

        #region Metodos

        public MExplosionMateriales.DetallePedido getDetallePedidos()
        {
            return _detpedidos;
        }

        public delegate string ValidarDetallePedido(string strCodigo);

        #endregion

        #region Interfaces publicas

        public ValidarDetallePedido validarDetallePedido { get; set; }

        public string strReferencia
        {
            get { return _detpedidos.strReferencia; }
            set {_detpedidos.strReferencia = value; base.OnPropertyChanged("strReferencia"); }
        }

        public string strNombreReferencia
        {
            get { return _detpedidos.strNombreReferencia; }
            set { _detpedidos.strNombreReferencia = value; base.OnPropertyChanged("strNombreReferencia"); }
        }

        public string strColor
        {
            get { return _detpedidos.strColor; }
            set { _detpedidos.strColor = value; base.OnPropertyChanged("strColor"); }
        }

        public string strNombreColor
        {
            get { return _detpedidos.strNombreColor; }
            set { _detpedidos.strNombreColor = value; base.OnPropertyChanged("strNombreColor"); }
        }

        public Int32 numCantidad
        {
            get { return _detpedidos.numCantidad; }
            set { _detpedidos.numCantidad = value; base.OnPropertyChanged("numCantidad"); }
        }

        public string strTieneExplosion
        {
            get { return _detpedidos.strTieneExplosion; }
            set { _detpedidos.strTieneExplosion = value; base.OnPropertyChanged("strTieneExplosion"); }
        }

        public string strTieneStandard
        {
            get { return _detpedidos.strTieneStandard; }
            set { _detpedidos.strTieneStandard = value; base.OnPropertyChanged("strTieneStandard"); }
        }

        public string strNumeroExplosion
        {
            get { return _detpedidos.strNumeroExplosion; }
            set { _detpedidos.strNumeroExplosion = value; base.OnPropertyChanged("strNumeroExplosion"); }
        }

        public Boolean logIncluir
        {
            get { return _detpedidos.logIncluir; }
            set { _detpedidos.logIncluir = value; base.OnPropertyChanged("logIncluir"); }
        }

        public string strCodCli
        {
            get { return _detpedidos.strCodCli; }
            set { _detpedidos.strCodCli = value; base.OnPropertyChanged("strCodCli"); }
        }

        public Int32 numPed
        {
            get { return _detpedidos.numPed; }
            set { _detpedidos.numPed = value; base.OnPropertyChanged("numPed"); }
        }

        public DateTime dtmFec
        {
            get { return _detpedidos.dtmFec; }
            set { _detpedidos.dtmFec = value; base.OnPropertyChanged("dtmFec"); }
        }

        public Boolean logPuedeIncluir
        {
            get { return _detpedidos.logPuedeIncluir; }
            set { _detpedidos.logPuedeIncluir = value; base.OnPropertyChanged("logPuedeIncluir"); }
        }

        #endregion

        #region IDataErrorInfo Members

        string IDataErrorInfo.Error { get { return null; } }

        string IDataErrorInfo.this[string propertyName]
        {
            get { return this.GetValidationError(propertyName); }
        }

        #endregion

        #region Validation

        /// <summary>
        /// Returns true if this object has no validation errors.
        /// </summary>
        /// 

        public bool IsValid
        {
            get
            {
                foreach (string property in ValidatedProperties)
                    if (GetValidationError(property) != null)
                        return false;

                return true;
            }
        }

        static readonly string[] ValidatedProperties = 
                    { 
                        "logIncluir"
                    };

        string GetValidationError(string propertyName)
        {
            if (Array.IndexOf(ValidatedProperties, propertyName) < 0)
                return null;

            string error = null;

            switch (propertyName)
            {
                case "logIncluir":
                    error = this.ValidateLog();
                    break;
                default:
                    Debug.Fail("Unexpected property being validated on Customer: " + propertyName);
                    break;
            }
            return error;
        }

        string ValidateLog()
        {
            try
            {
                if (logIncluir == true)
                {
                    if (strTieneStandard == "N") { return "No se puede incluir en la explosión por que no tiene standad. "; }
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
            return null;
        }

        #endregion

    }

}
